package com.jzo2o.orders.manager.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.common.model.msg.TradeStatusMsg;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.manager.model.dto.request.OrdersPayReqDTO;
import com.jzo2o.orders.manager.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.orders.manager.model.dto.response.OrdersPayResDTO;
import com.jzo2o.orders.manager.model.dto.response.PlaceOrderResDTO;

/**
 * <p>
 * 下单服务类
 * </p>
 *
 * @author itcast
 * @since 2023-07-10
 */
public interface IOrdersCreateService extends IService<Orders> {

    /**
     * 用户预约请求下单
     * @param placeOrderReqDTO 请求实体
     * @return
     */
    PlaceOrderResDTO placeOrder(PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * 用户预约请求下单
     * @param placeOrderReqDTO 请求实体
     * @return
     */
    PlaceOrderResDTO placeLockOrder(PlaceOrderReqDTO placeOrderReqDTO, Long userId, String serveStartTime);

    /**
     * 保存订单：解决事务失效
     * @param orders
     */
    void saveOrders(Orders orders);

    /**
     * 订单支付
     * @param id 订单id
     * @param ordersPayReqDTO 支付请求实体
     * @return
     */
    OrdersPayResDTO pay(Long id, OrdersPayReqDTO ordersPayReqDTO);

    /**
     * 订单支付结果查询
     * @param id 订单id
     * @return
     */
    OrdersPayResDTO payResult(Long id);

    /**
     * 支付成功， 更新数据库的订单表及其他信息
     *
     * @param tradeStatusMsg 交易状态消息
     */
    void paySuccess(TradeStatusMsg tradeStatusMsg);
}
